/**
 * File Name   : ProcessManager.java
 * Description : 
 */
package feng.process.api;

import org.apache.log4j.Logger;

import feng.process.ProcessDataInfo;
import feng.process.ProcessObject;
import feng.process.api.bean.ParamProcessCreateBean;
import feng.process.api.service.ProcessService;

/**
 * 流程管理类，支持流程发起、环节处理等操作
 * @author 冯昌硕
 * @create 2012-10-24 下午10:37:30
 */
public class ProcessManager {
    
    private static final Logger log = Logger.getLogger(ProcessManager.class);
    
    private ProcessService service;
    
    public ProcessManager() throws Exception {
        service = new ProcessService();
    }

    /**
     * 功能：创建一个新的流程实例。主要用到templeteName、title参数
     * 
     * @param templeteName
     * @param title
     * @return 返回-1表示流程发起失败
     * @throws  
     * @create 2012-10-25 上午12:14:29
     */
    public long startNewProcess(ParamProcessCreateBean pcreateBean) {
        log.debug("创建流程实例，参数：pcreateBean=["+ pcreateBean +"]");
        
        // 1. 模板状态判断
        int templeteStatus = service.getTempleteStatus(pcreateBean.getTempleteName());
        log.debug("创建流程实例，templeteStatus=["+ templeteStatus +"]");
        if(-1 == templeteStatus) {
            log.warn("流程模板["+ pcreateBean.getTempleteName() +"] 获取状态为-1，无效状态，不能发起流程");
            return -1;
        } else if(templeteStatus != 0) {
            log.warn("流程模板["+ pcreateBean.getTempleteName() +"] 为非上线状态，不能发起流程");
            return -2;
        }
        
        // 2.模板状态正常,判断流程引擎是否启动了该模板
        ProcessObject processObj = ProcessDataInfo.processMap.get(pcreateBean.getTempleteName());
        if(null == processObj) {
            log.warn("引擎中流程模板["+ pcreateBean.getTempleteName() +"]未找到或未启动，不能发起流程");
            return -3;
        }
        
        // 3. 开启流程启动事务
        long flowId = service.startProcess(pcreateBean);
        
        return flowId;
    }
    
    /**
     * 功能：创建草稿。主要用到templeteName、title参数
     * @param pcreateBean
     * @return
     * @create 2012-10-25 上午12:23:02
     */
    public long createDraft(ParamProcessCreateBean pcreateBean) {
        log.debug("创建流程实例，参数：pcreateBean=["+ pcreateBean +"]");
        return 0L;
    }
    
    /**
     * 功能：删除指定ID的流程实例
     * @param processInstanceID
     * @return
     * @create 2012-10-25 上午12:25:51
     */
    public boolean deleteProcess(long processInstanceID) {
        log.debug("删除流程实例，参数：processInstanceID=["+ processInstanceID +"]");
        return service.deleteProcessInstance(processInstanceID);
    }
    
}
